<?php

namespace Gds\AchatBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Gds\AchatBundle\Entity\BonLivraisonFournisseur;
use Gds\AchatBundle\Form\BonLivraisonFournisseurType;
use Gds\VenteBundle\Entity\LigneBonLivraisonClient;
use Symfony\Component\HttpFoundation\Response;
use Gds\AchatBundle\Entity\StockAchat;
use Gds\AchatBundle\Entity\FactureFournisseur;
use Gds\AchatBundle\Entity\CategorieRemiseFournisseur;

class FactureController extends Controller {

    public function indexAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $societe = $em->getRepository('GdsArticleBundle:Societe')->findAll()[0];
        $timbre = $societe->getTimbreFiscal();
        $bon_livraison = new BonLivraisonFournisseur();
        $request = $this->getRequest();
        $form = $this->createForm(new BonLivraisonFournisseurType(), $bon_livraison);
        $user = $this->getUser();
        if ($request->isMethod('POST')) {
            try {
                $articles = json_decode($request->get('articles'));
                if (count($articles->articles) == 0) {
                    $response = new Response(json_encode(array('success' => false)));
                    $response->headers->set('Content-Type', 'application/json');
                    return $response;
                }
                $heure = $request->get('heure');
                $form->bind($request);
                $bon_livraison = $form->getData();
                $fournisseur = $bon_livraison->getFournisseur();
                $nom_dep = $request->get('departement');
                $bon_livraison->setHeure($heure);
                $departement = $em->getRepository('GdsArticleBundle:Departement')->findOneByNom($nom_dep);
                foreach ($articles->articles as $json_article) {
                    $article = $em->getRepository('GdsArticleBundle:Article')->find($json_article->id);
                    $stock = $em->getRepository('GdsArticleBundle:Stock')->findOneBy(array('article' => $article, 'departement' => $departement));
                    $prix_achat_ttc = $json_article->prix_achat * (1 + ($json_article->taux_tva / 100)) * (1 - ($json_article->remise / 100));
                    $montant_ttc = $montant_ttc + ($prix_achat_ttc * $json_article->quantite);
                    $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findOneBy(array('stock' => $stock, 'is_noir' => 0, 'prix_achat_ttc' => $prix_achat_ttc));
                    if (!$stock_achat) {
                        $stock_achat = new StockAchat();
                        $stock_achat->setIsNoir(false);
                        $stock_achat->setPrixAchatTtc($prix_achat_ttc);
                        $stock_achat->setQuantite($json_article->quantite);
                        $stock_achat->setStock($stock);
                    } else {
                        $stock_achat->setQuantite($stock_achat->getQuantite() + $json_article->quantite);
                    }
                    $stock->setQuantiteBlanc($stock->getQuantiteBlanc() + $json_article->quantite);
                    $em->persist($stock_achat);
                    $em->persist($stock);
                    $taux_tva = $json_article->taux_tva;
                    $remise = $json_article->remise;
                    $ligne = new LigneBonLivraisonFournisseur();
                    $ligne->setArticle($article);
                    $ligne->setQuantite($json_article->quantite);
                    $ligne->setQuantiteRetour(0);
                    $ligne->setPrixUnitaireHt($json_article->prix_achat);
                    $ligne->setTauxRemise($remise);
                    $ligne->setTauxTva($taux_tva);
                    $bon_livraison->addLigne($ligne);
                    $categorie_remise = $em->getRepository('GdsAchatBundle:CategorieRemiseFournisseur')->findOneBy(array('fournisseur' => $fournisseur, 'article' => $article));
                    if ($categorie_remise != null) {
                        $categorie_remise->setRemise($remise);
                        $categorie_remise->setPrixUnitaireHt($json_article->prix_achat);
                    } else {
                        $categorie_remise = new CategorieRemiseFournisseur();
                        $categorie_remise->setArticle($article);
                        $categorie_remise->setFournisseur($fournisseur);
                        $categorie_remise->setRemise($remise);
                        $categorie_remise->setPrixUnitaireHt($json_article->prix_achat);
                        $em->persist($categorie_remise);
                    }
                }
                $bon_livraison->setDepartement($departement);
                $bon_livraison->setReste($montant_ttc);
                $bon_livraison->setMontantTtc($montant_ttc);
                $bon_livraison->setUser($user);
                $em->persist($bon_livraison);
                $facture=new FactureFournisseur();
                $facture->setDate($bon_livraison->getDate());
                $facture->setFournisseur($bon_livraison->getFournisseur());
                $facture->setMontantTtc($facture->getMontantTtc()+$timbre);
                $facture->setReference($bon_livraison->getReference());
                $facture->addBonLivraison($bon_livraison);
                $facture->setUser($this->getUser());
                $em->persist($facture);
                $em->flush();
                $ref_num = $societe->getNumeroBonLivraison();
                $ref_facture = $societe->getPrefixeFacture() . ' ' . $societe->getNumeroFacture();
                $societe->setNumeroBonLivraison($ref_num + 1);
                $societe->setNumeroFacture($societe->getNumeroFacture() + 1);
                $bon_livraison->setReference($ref . ' ' . $ref_num);
                $bon_livraison->setDepartement($departement);
                $bon_livraison->setReste($montant_bl_ttc);
                $bon_livraison->setMontantBlancTtc($montant_bl_ttc);
                $bon_livraison->setMontantNoirTtc(0);
                $bon_livraison->setUser($user);
                $bon_livraison->setIsCloturer(true);
                $facture = new FactureClient();
                $facture->setDate($bon_livraison->getDate());
                $facture->setHeure($bon_livraison->getHeure());
                $facture->setMontantTtc($bon_livraison->getMontantTtc() + $timbre);
                $facture->setReste($facture->getMontantTtc());
                $facture->setReference($ref_facture);
                $facture->addBonLivraison($bon_livraison);
                $facture->setUser($user);
                $solde_client = $client->getSolde();
                $limite_credit = $client->getLimiteCredit();
                if ($solde_client + $montant_bl_ttc + $timbre > $limite_credit) {
                    $mdp = $request->get('mdp');
                    $code_secret = $societe->getCodeSecret();
                    if ($mdp != $code_secret) {
                        $response = new Response(json_encode(array('limit_depass' => true)));
                        $response->headers->set('Content-Type', 'application/json');
                        return $response;
                    }
                }
                $client->setSolde($solde_client + $montant_bl_ttc + $timbre);
                $em->persist($facture);
                $em->persist($bon_livraison);
                $history_bon_livraison->setReference($bon_livraison->getReference());
                $history_bon_livraison->setDepartement($bon_livraison->getDepartement());
                $history_bon_livraison->setReste($bon_livraison->getReste());
                $history_bon_livraison->setMontantBlancTtc($bon_livraison->getMontantBlancTtc());
                $history_bon_livraison->setMontantNoirTtc($bon_livraison->getMontantNoirTtc());
                $history_bon_livraison->setUser($user);
                $history_bon_livraison->setDate($bon_livraison->getDate());
                $history_bon_livraison->setHeure($bon_livraison->getHeure());
                $history_bon_livraison->setClient($bon_livraison->getClient());
                $history_bon_livraison->setIsCloturer(true);
                $em->persist($history_bon_livraison);
                $em->flush();
                $response = new Response(json_encode(array('success' => true)));
                $response->headers->set('Content-Type', 'application/json');
                return $response;
            } catch (Exception $e) {
                $response = new Response(json_encode(array('success' => false)));
                $response->headers->set('Content-Type', 'application/json');
                return $response;
            }
        }
        return $this->render('GdsAchatBundle:Facture:facture.html.twig', array('form' => $form->createView(), 'timbre' => $timbre, 'user' => $user));
    }

    public function getAllFactureAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $request = $this->getRequest();
        $num = $request->get('numero');
        $raison = $request->get('raison_social');
        $date1 = $request->get('date1');
        $date2 = $request->get('date2');
        $heure1 = $request->get('heure1');
        $heure2 = $request->get('heure2');
        $ref = $request->get('reference');
        $des = $request->get('designation');
        $ttc1 = $request->get('ttc1');
        $ttc2 = $request->get('ttc2');
        $is_cloture = $request->get('is_cloture');
        if ($is_cloture == 2)
            $is_cloture = '';
        $query = $em->getRepository('GdsAchatBundle:FactureFournisseur')->getResult($num, $raison, $date1, $date2, $heure1, $heure2, $ref, $des, $ttc1, $ttc2, $is_cloture);
        $paginator = $this->get('knp_paginator');
        $pagination = $paginator->paginate(
                $query, $request->get('page', 1)/* page number */, 10/* limit per page */
        );

        if ($request->get('type')) {
            return $this->render('GdsAchatBundle:Facture:page_liste_facture.html.twig', array('pagination' => $pagination));
        }
        if ($request->get('retour') != "")
            return $this->render('GdsAchatBundle:Facture:liste_facture.html.twig', array('pagination' => $pagination));
        return $this->render('GdsAchatBundle:Facture:all_facture.html.twig', array('pagination' => $pagination));
    }

    public function showAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $request = $this->getRequest();
        $id = $request->get('id');
        $facture = $em->getRepository('GdsAchatBundle:FactureFournisseur')->find($id);
        $bons_livraison = $facture->getBonLivraisons();
        $all_lignes = array();
        $all_taxes = array();
        $montant_ttc = 0;
        foreach ($bons_livraison as $a => $bon_livraison) {
            $montant_ttc+= $bon_livraison->getMontantTtc();
            $lignes_bon_livraison = $em->getRepository('GdsAchatBundle:LigneBonLivraisonFournisseur')->findBy(array('bon_livraison' => $bon_livraison));
            $lignes = $em->getRepository('GdsVenteBundle:LigneBonLivraisonClient')->findBy(array('bon_livraison' => $bon_livraison), array('taux_tva' => 'ASC'));
            $taxes = array();
            foreach ($lignes as $ligne) {
                $tva = $ligne->getTauxTva();
                $base = $ligne->getQuantite() * $ligne->getPrixUnitaireHt() * (1 - $ligne->getTauxRemise() / 100);
                $montant = $base * $tva / 100;
                $exist = false;
                foreach ($taxes as $k => $taxe) {
                    if (!$exist && $taxe['tva'] == $tva) {
                        $taxes[$k]['base']+=$base;
                        $taxes[$k]['montant']+=$montant;
                        $exist = true;
                    }
                }
                if (!$exist) {
                    $taxe = array();
                    $taxe['tva'] = $tva;
                    $taxe['base'] = $base;
                    $taxe['montant'] = $montant;
                    $taxes[count($taxes)] = $taxe;
                }
            }
            $all_lignes[$a] = $lignes_bon_livraison;
            $all_taxes[$a] = $taxes;
        }
        $taxes_facture = array();
        foreach ($all_taxes as $taxes) {
            $taxes_facture = array_merge($taxes_facture, $taxes);
        }
        $taxes_facture = $this->array_sort($taxes_facture, 'tva');
        $t = array();
        $cmp = 0;
        $t[0] = $taxes_facture[0];
        for ($i = 1; $i < count($taxes_facture); $i++) {
            if ($taxes_facture[$i]['tva'] == $t[$cmp]['tva']) {
                $t[$cmp]['base']+=$taxes_facture[$i]['base'];
                $t[$cmp]['montant']+=$taxes_facture[$i]['montant'];
            } else {
                $cmp++;
                $t[$cmp]['tva'] = $taxes_facture[$i]['tva'];
                $t[$cmp]['base'] = $taxes_facture[$i]['base'];
                $t[$cmp]['montant'] = $taxes_facture[$i]['montant'];
            }
        }
        $taxes_facture = $t;
        $timbre = $facture->getMontantTtc() - $montant_ttc;
        return $this->render('GdsVenteBundle:Facture:facture_show.html.twig', array('alllignes' => $all_lignes, 'alltaxes' => $all_taxes, 'facture' => $facture, 'taxefacture' => $taxes_facture, 'timbre' => $timbre));
    }

    function array_sort($array, $key) {
        for ($i = 0; $i < sizeof($array); $i++) {
            $sort_values[$i] = $array[$i][$key];
        }
        asort($sort_values);
        reset($sort_values);

        while (list ($arr_key, $arr_val) = each($sort_values)) {
            $sorted_arr[] = $array[$arr_key];
        }
        unset($array);
        return $sorted_arr;
    }

    public function editAction() {
        $request = $this->getRequest();
        $id = $request->get('id');
        $em = $this->getDoctrine()->getEntityManager();
        $facture = $em->getRepository('GdsVenteBundle:FactureClient')->find($id);
        $societe = $em->getRepository('GdsArticleBundle:Societe')->findAll()[0];
        $timbre = $societe->getTimbreFiscal();
        $bon_livraison = $facture->getBonLivraisons()[0];
        $ref_bl = $bon_livraison->getReference();
        $form = $this->createForm(new BonLivraisonClientType, $bon_livraison);
        $user = $this->getUser();
        if ($request->isMethod('POST')) {
            $articles = json_decode($request->get('articles'));
            if (count($articles->articles) == 0) {
                $response = new Response(json_encode(array('success' => false)));
                $response->headers->set('Content-Type', 'application/json');
                return $response;
            }
            $history_bon_livraison = new HistoryBonLivraisonClient();
            $departement = $bon_livraison->getDepartement();
            foreach ($bon_livraison->getLignesBonLivraison() as $ligne) {
                $article = $ligne->getArticle();
                $quantite_blanc = $ligne->getQuantiteBlanc();
                $prix_achat_ttc = $ligne->getPrixAchatTtc();
                $stock = $em->getRepository('GdsArticleBundle:Stock')->findOneBy(array('departement' => $departement, 'article' => $article));
                $quantite_stock_blanc = $stock->getQuantiteBlanc();
                $stock->setQuantiteBlanc($quantite_stock_blanc + $quantite_blanc);
                if ($quantite_blanc != 0) {
                    $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findOneBy(array('stock' => $stock, 'prix_achat_ttc' => $prix_achat_ttc, 'is_noir' => 0));
                    if ($stock_achat != null) {
                        if ($quantite_stock_blanc >= 0) {
                            $stock_achat->setQuantite($stock_achat->getQuantite() + $quantite_blanc);
                        } else {
                            $stock_achat->setQuantite($stock_achat->getQuantite() + $quantite_blanc + $quantite_stock_blanc);
                        }
                    } else {
                        $stock_achat = new StockAchat();
                        $stock_achat->setIsNoir(0);
                        $stock_achat->setPrixAchatTtc($prix_achat_ttc);
                        $stock_achat->setStock($stock);
                        if ($quantite_stock_blanc >= 0) {
                            $stock_achat->setQuantite($quantite_blanc);
                        } else {
                            $stock_achat->setQuantite($quantite_blanc + $quantite_stock_blanc);
                        }
                        $em->persist($stock_achat);
                    }
                }
                $em->remove($ligne);
            }
            $heure = $request->get('heure');
            $form->bind($request);
            $bon_livraison = $form->getData();
            $client = $bon_livraison->getClient();
            $bon_livraison->setHeure($heure);
            $bon_livraison->setReference($ref_bl);
            $montant_bl_ttc = 0;
            foreach ($articles->articles as $json_article) {
                $article = $em->getRepository('GdsArticleBundle:Article')->find($json_article->id);
                $stock = $em->getRepository('GdsArticleBundle:Stock')->findOneBy(array('article' => $article, 'departement' => $departement));
                $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findBy(array('stock' => $stock, 'is_noir' => 0), array('prix_achat_ttc' => 'ASC'));
                $quantite = $json_article->quantite;
                $prix_achat_ttc = 0;
                $i = 0;
                while ($quantite > 0 && $i < count($stock_achat)) {
                    if ($quantite <= $stock_achat[$i]->getQuantite()) {
                        $stock_achat[$i]->setQuantite($stock_achat[$i]->getQuantite() - $quantite);
                        $prix_achat_ttc += $stock_achat[$i]->getPrixAchatTtc() * $quantite;
                        $quantite = 0;
                    } else {
                        $prix_achat_ttc += $stock_achat[$i]->getPrixAchatTtc() * $stock_achat[$i]->getQuantite();
                        $quantite -= $stock_achat[$i]->getQuantite();
                        $stock_achat[$i]->setQuantite(0);
                        $em->remove($stock_achat[$i]);
                    }
                    $i++;
                }
                if ($quantite > 0) {
                    $prix_achat_ttc += $article->getPrixAchatHt() * (1 + $article->getTauxTva() / 100) * $quantite;
                }
                $quantite = $json_article->quantite;
                $prix_vente = $json_article->prix_vente;
                $taux_tva = $json_article->taux_tva;
                $remise = $json_article->remise;
                $prix_vente_ttc = $prix_vente * (1 + $taux_tva / 100) * (1 - $remise / 100);
                $montant_bl_ttc+= $quantite * $prix_vente_ttc;
                $stock->setQuantiteBlanc($stock->getQuantiteBlanc() - $quantite);
                $prix_achat_ttc /= $quantite;
                $ligne = new LigneBonLivraisonClient();
                $ligne->setArticle($article);
                $ligne->setQuantiteBlanc($quantite);
                $ligne->setQuantiteNoir(0);
                $ligne->setQuantiteRetour(0);
                $ligne->setPrixUnitaireHt($prix_vente);
                $ligne->setPrixAchatTtc($prix_achat_ttc);
                $ligne->setTauxRemise($remise);
                $ligne->setTauxTva($taux_tva);
                $bon_livraison->addLignesBonLivraison($ligne);

                $history_ligne = new HistoryLigneBonLivraisonClient();
                $history_ligne->setArticle($article);
                $history_ligne->setQuantiteBlanc($quantite);
                $history_ligne->setQuantiteNoir(0);
                $history_ligne->setQuantiteRetour(0);
                $history_ligne->setPrixUnitaireHt($prix_vente);
                $history_ligne->setPrixAchatTtc($prix_achat_ttc);
                $history_ligne->setTauxRemise($remise);
                $history_ligne->setTauxTva($taux_tva);
                $history_bon_livraison->addHistoryLignesBonLivraison($history_ligne);

                $categorie_remise = $em->getRepository('GdsVenteBundle:CategorieRemise')->findOneBy(array('client' => $client, 'article' => $article));
                if ($categorie_remise != null)
                    $categorie_remise->setRemise($remise);
                else {
                    $categorie_remise = new CategorieRemise();
                    $categorie_remise->setArticle($article);
                    $categorie_remise->setClient($client);
                    $categorie_remise->setRemise($remise);
                    $em->persist($categorie_remise);
                }
            }
            $bon_livraison->setMontantBlancTtc($montant_bl_ttc);
            $bon_livraison->setMontantNoirTtc(0);
            $facture->setMontantTtc($montant_bl_ttc + $timbre);
            $facture->setReste($facture->getMontantTtc());
            $solde_client = $client->getSolde();
            $limite_credit = $client->getLimiteCredit();
            if ($solde_client + $montant_bl_ttc + $timbre > $limite_credit) {
                $mdp = $request->get('mdp');
                $code_secret = $societe->getCodeSecret();
                if ($mdp != $code_secret) {
                    $response = new Response(json_encode(array('limit_depass' => true)));
                    $response->headers->set('Content-Type', 'application/json');
                    return $response;
                }
            }
            $client->setSolde($solde_client + $montant_bl_ttc + $timbre);
            $history_bon_livraison->setReference($bon_livraison->getReference());
            $history_bon_livraison->setDepartement($bon_livraison->getDepartement());
            $history_bon_livraison->setReste($bon_livraison->getReste());
            $history_bon_livraison->setMontantBlancTtc($bon_livraison->getMontantBlancTtc());
            $history_bon_livraison->setMontantNoirTtc($bon_livraison->getMontantNoirTtc());
            $history_bon_livraison->setUser($user);
            $history_bon_livraison->setDate($this->DateTimeNow()[0]);
            $history_bon_livraison->setHeure($this->DateTimeNow()[1]);
            $history_bon_livraison->setClient($bon_livraison->getClient());
            $history_bon_livraison->setIsCloturer(true);
            $em->persist($history_bon_livraison);
            $em->flush();
            $response = new Response(json_encode(array('success' => true)));
            $response->headers->set('Content-Type', 'application/json');
            return $response;
        }
        $time = $bon_livraison->getTime();
        $heure = $bon_livraison->getHeure();
        $lignes = array();
        foreach ($bon_livraison->getLignesBonLivraison() as $k => $ligne) {
            $lignes[$k] = $ligne;
        }
        return $this->render('GdsVenteBundle:Facture:facture_edit.html.twig', array('form' => $form->createView(), 'heure' => $heure, 'time' => $time, 'lignes' => $lignes, 'id' => $id, 'reference' => $facture->getReference(), 'timbre' => $timbre, 'user' => $user));
    }

    public function duppliquerAction() {
        $request = $this->getRequest();
        $id = $request->get('id');
        $em = $this->getDoctrine()->getEntityManager();
        $facture = $em->getRepository('GdsVenteBundle:FactureClient')->find($id);
        $old_bon_livraison = $facture->getBonLivraisons()[0];
        $bon_livraison = clone $old_bon_livraison;
        $societe = $em->getRepository('GdsArticleBundle:Societe')->findAll()[0];
        $pref = $societe->getPrefixeBonLivraison();
        $num = $societe->getNumeroBonLivraison();
        $bon_livraison->setReference($pref . ' ' . $num);
        $ref_facture = $societe->getPrefixeFacture() . ' ' . $societe->getNumeroFacture();
        $timbre = $societe->getTimbreFiscal();
        $user = $this->getUser();
        $form = $this->createForm(new BonLivraisonClientType, $bon_livraison);
        if ($request->isMethod('POST')) {
            try {
                $articles = json_decode($request->get('articles'));
                if (count($articles->articles) == 0) {
                    $response = new Response(json_encode(array('success' => false)));
                    $response->headers->set('Content-Type', 'application/json');
                    return $response;
                }
                $history_bon_livraison = new HistoryBonLivraisonClient();
                $heure = $request->get('heure');
                $form->bind($request);
                $bon_livraison = $form->getData();
                $client = $bon_livraison->getClient();
                $nom_dep = $request->get('departement');
                $bon_livraison->setHeure($heure);
                $montant_bl_ttc = 0;
                $departement = $em->getRepository('GdsArticleBundle:Departement')->findOneByNom($nom_dep);
                foreach ($articles->articles as $json_article) {
                    $article = $em->getRepository('GdsArticleBundle:Article')->find($json_article->id);
                    $stock = $em->getRepository('GdsArticleBundle:Stock')->findOneBy(array('article' => $article, 'departement' => $departement));
                    $stock_achat = $em->getRepository('GdsAchatBundle:StockAchat')->findBy(array('stock' => $stock, 'is_noir' => 0), array('prix_achat_ttc' => 'ASC'));
                    $quantite = $json_article->quantite;
                    $prix_achat_ttc = 0;
                    $i = 0;
                    while ($quantite > 0 && $i < count($stock_achat)) {
                        if ($quantite <= $stock_achat[$i]->getQuantite()) {
                            $stock_achat[$i]->setQuantite($stock_achat[$i]->getQuantite() - $quantite);
                            $prix_achat_ttc += $stock_achat[$i]->getPrixAchatTtc() * $quantite;
                            $quantite = 0;
                        } else {
                            $prix_achat_ttc += $stock_achat[$i]->getPrixAchatTtc() * $stock_achat[$i]->getQuantite();
                            $quantite -= $stock_achat[$i]->getQuantite();
                            $stock_achat[$i]->setQuantite(0);
                            $em->remove($stock_achat[$i]);
                        }
                        $i++;
                    }
                    if ($quantite > 0) {
                        $prix_achat_ttc += $article->getPrixAchatHt() * (1 + $article->getTauxTva() / 100) * $quantite;
                    }
                    $quantite = $json_article->quantite;
                    $stock->setQuantiteBlanc($stock->getQuantiteBlanc() - $quantite);
                    $prix_achat_ttc /= $quantite;
                    $prix_vente = $json_article->prix_vente;
                    $taux_tva = $json_article->taux_tva;
                    $remise = $json_article->remise;
                    $prix_vente_ttc = $prix_vente * (1 + $taux_tva / 100) * (1 - $remise / 100);
                    $montant_bl_ttc+= $quantite * $prix_vente_ttc;
                    $ligne = new LigneBonLivraisonClient();
                    $ligne->setArticle($article);
                    $ligne->setQuantiteBlanc($quantite);
                    $ligne->setQuantiteNoir(0);
                    $ligne->setQuantiteRetour(0);
                    $ligne->setPrixUnitaireHt($prix_vente);
                    $ligne->setPrixAchatTtc($prix_achat_ttc);
                    $ligne->setTauxRemise($remise);
                    $ligne->setTauxTva($taux_tva);
                    $bon_livraison->addLignesBonLivraison($ligne);

                    $history_ligne = new HistoryLigneBonLivraisonClient();
                    $history_ligne->setArticle($article);
                    $history_ligne->setQuantiteBlanc($quantite);
                    $history_ligne->setQuantiteNoir(0);
                    $history_ligne->setQuantiteRetour(0);
                    $history_ligne->setPrixUnitaireHt($prix_vente);
                    $history_ligne->setPrixAchatTtc($prix_achat_ttc);
                    $history_ligne->setTauxRemise($remise);
                    $history_ligne->setTauxTva($taux_tva);
                    $history_bon_livraison->addHistoryLignesBonLivraison($history_ligne);
                    $categorie_remise = $em->getRepository('GdsVenteBundle:CategorieRemise')->findOneBy(array('client' => $client, 'article' => $article));
                    if ($categorie_remise != null)
                        $categorie_remise->setRemise($remise);
                    else {
                        $categorie_remise = new CategorieRemise();
                        $categorie_remise->setArticle($article);
                        $categorie_remise->setClient($client);
                        $categorie_remise->setRemise($remise);
                        $em->persist($categorie_remise);
                    }
                }
                $ref_num = $societe->getNumeroBonLivraison();
                $societe->setNumeroBonLivraison($ref_num + 1);
                $societe->setNumeroFacture($societe->getNumeroFacture() + 1);
                $bon_livraison->setReference($pref . ' ' . $ref_num);
                $bon_livraison->setReste(0);
                $bon_livraison->setMontantBlancTtc($montant_bl_ttc);
                $bon_livraison->setMontantNoirTtc(0);
                $facture = new FactureClient();
                $facture->setDate($bon_livraison->getDate());
                $facture->setHeure($bon_livraison->getHeure());
                $facture->setMontantTtc($bon_livraison->getMontantTtc() + $timbre);
                $facture->setReste($facture->getMontantTtc());
                $facture->setReference($ref_facture);
                $facture->setUser($user);
                $facture->addBonLivraison($bon_livraison);
                $solde_client = $client->getSolde();
                $limite_credit = $client->getLimiteCredit();
                if ($solde_client + $montant_bl_ttc + $timbre > $limite_credit) {
                    $mdp = $request->get('mdp');
                    $code_secret = $societe->getCodeSecret();
                    if ($mdp != $code_secret) {
                        $response = new Response(json_encode(array('limit_depass' => true)));
                        $response->headers->set('Content-Type', 'application/json');
                        return $response;
                    }
                }
                $client->setSolde($solde_client + $montant_bl_ttc + $timbre);
                $em->persist($facture);
                $em->persist($bon_livraison);
                $history_bon_livraison->setReference($bon_livraison->getReference());
                $history_bon_livraison->setDepartement($bon_livraison->getDepartement());
                $history_bon_livraison->setReste($bon_livraison->getReste());
                $history_bon_livraison->setMontantBlancTtc($bon_livraison->getMontantBlancTtc());
                $history_bon_livraison->setMontantNoirTtc($bon_livraison->getMontantNoirTtc());
                $history_bon_livraison->setUser($user);
                $history_bon_livraison->setDate($bon_livraison->getDate());
                $history_bon_livraison->setHeure($bon_livraison->getHeure());
                $history_bon_livraison->setClient($bon_livraison->getClient());
                $history_bon_livraison->setIsCloturer(true);
                $em->persist($history_bon_livraison);
                $em->flush();
                $response = new Response(json_encode(array('success' => true)));
                $response->headers->set('Content-Type', 'application/json');
                return $response;
            } catch (Exception $e) {
                $response = new Response(json_encode(array('success' => false)));
                $response->headers->set('Content-Type', 'application/json');
                return $response;
            }
        }
        $time = $bon_livraison->getTime();
        $heure = $bon_livraison->getHeure();
        $lignes = array();
        foreach ($bon_livraison->getLignesBonLivraison() as $k => $ligne) {
            $lignes[$k] = $ligne;
        }
        return $this->render('GdsVenteBundle:Facture:facture_duppliquer.html.twig', array('form' => $form->createView(), 'heure' => $heure, 'time' => $time, 'lignes' => $lignes, 'id' => $id, 'reference' => $ref_facture, 'timbre' => $timbre, 'user' => $user));
    }

    function DateTimeNow() {
        $date = date("Y-m-d H:i:s", time());
        list($a, $b) = split('[ ]', $date);
        list($h, $m, $s) = split('[:]', $b);
        $time = $h * 3600 + $m * 60 + $s;
        $date = new \DateTime('NOW');
        return (array($date, $time));
    }

}
